package com.gitee.sparta.core.process.operate;

import java.util.List;

/**
 * <p>
 *      针对 deny_tab 中进行操作
 * </p>
 *
 * @author zyred
 * @since v 0.0.1
 **/
public interface DenyTabOperate<V> {


    /**
     * 将用户主动调用 SpartaChannel#deny() 方法，并且
     * 将 sparta.enable-deny-persistence=true 的时候
     * 并且消息不是分段消费的时候，才会进入到 deny_tab
     * 中进行持久化操作，由于 redis 的特性，是无法保存很
     * 久的数据。所以需要用户自行处理
     *
     * @param fullTopic         完整的 topic， topic:metaId
     * @param readableTabKey    readable_tab key
     * @param denyTabKey        deny_tab key
     */
    void doProcessDenyPersistence(String fullTopic, String readableTabKey, String denyTabKey);

    /**
     * 一次调用，将会返回全量的没有 ack 的数据，并且只要调用该 api
     * metadata_tab 与 deny_tab 中的数据将会全部被删除，生产环境慎用
     *
     * @param denyTabKey        deny_tab key
     * @param metadataTabKey    metadata_tab key
     * @return  metadata
     */
    List<V> processDenys(String denyTabKey, String metadataTabKey);
}
